package com.xgit.iov.codegen.util;


import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;


@Slf4j
public class CommonUtil {

    /** 下划线 */
    private static final char SEPARATOR = '_';

    /**
     * 将驼峰命名格式转为下划线格式
     * @param value
     * @return
     */
    public static String toUnderLineName(String value){
        if (StringUtils.isEmpty(value))
            return "";
        StringBuilder result = new StringBuilder();
        for (int i = 0;i < value.length();i++){
            String s = value.substring(i, i + 1);
            // 在大写字母前添加下划线
            if (s.equals(s.toUpperCase())
                    && !Character.isDigit(s.charAt(0))&& !"_".equals(s)) {
                result.append("_");
                s = s.toLowerCase();
            }
            result.append(s);
        }
        return result.toString();
    }

    /**
     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。 例如：HELLO_WORLD->HelloWorld
     *
     * @param name 转换前的下划线大写方式命名的字符串
     * @return 转换后的驼峰式命名的字符串
     */
    public static String convertToCamelCase(String name) {
        StringBuilder result = new StringBuilder();
        // 快速检查
        if (name == null || name.isEmpty()) {
            // 没必要转换
            return "";
        } else if (!name.contains("_")) {
            // 不含下划线，仅将首字母大写
            return name.substring(0, 1).toUpperCase() + name.substring(1);
        }
        // 用下划线将原始字符串分割
        String[] camels = name.split("_");
        for (String camel : camels) {
            // 跳过原始字符串中开头、结尾的下换线或双重下划线
            if (camel.isEmpty()) {
                continue;
            }
            // 首字母大写
            result.append(camel.substring(0, 1).toUpperCase());
            result.append(camel.substring(1).toLowerCase());
        }
        return result.toString();
    }

    /**
     * 驼峰式命名法 例如：user_name->userName
     */
    public static String toCamelCase(String s) {
        if (s == null) {
            return null;
        }
        s = s.toLowerCase();
        StringBuilder sb = new StringBuilder(s.length());
        boolean upperCase = false;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            if (c == SEPARATOR) {
                upperCase = true;
            } else if (upperCase) {
                sb.append(Character.toUpperCase(c));
                upperCase = false;
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    public static String format(String template, Object... params) {
        if (ObjectUtil.isEmpty(params) || ObjectUtil.isEmpty(template)) {
            return template;
        }
        return StrFormatter.format(template, params);
    }


}
